home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 May / EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso / earcd / misc / emu / arosdev.lha / AROS / scripts / cint2.awk next >
Text File  |  1997-01-03  |  11KB  |  492 lines

  1. BEGIN {
  2.     date="27-11-96";
  3.  
  4.     RTYPES["long"]="LONG";
  5.     RTYPES["unsigned long"]="ULONG";
  6.     RTYPES["short"]="WORD";
  7.     RTYPES["unsigned short"]="UWORD";
  8.     RTYPES["char"]="BYTE";
  9.     RTYPES["unsigned char"]="UBYTE";
  10.  
  11.     TYPES["ULONG"]=1;
  12.     TYPES["LONG"]=1;
  13.     TYPES["UBYTE"]=1;
  14.     TYPES["BYTE"]=1;
  15.     TYPES["UWORD"]=1;
  16.     TYPES["WORD"]=1;
  17.     TYPES["APTR"]=1;
  18.     TYPES["BPTR"]=1;
  19.     TYPES["STRPTR"]=1;
  20.     TYPES["BSTR"]=1;
  21.     TYPES["BOOL"]=1;
  22.     TYPES["Tag"]=1;
  23.     TYPES["FLOAT"]=1;
  24.     TYPES["DOUBLE"]=1;
  25.     TYPES[""]=1;
  26.     TYPES[""]=1;
  27.  
  28.     # 1- types
  29.     # 2- commands
  30.     KEYWORDS["struct"]=2;
  31.     KEYWORDS["int"]=1;
  32.     KEYWORDS["char"]=1;
  33.     KEYWORDS["double"]=1;
  34.     KEYWORDS["float"]=1;
  35.     KEYWORDS["for"]=10;
  36.     KEYWORDS["if"]=10;
  37.     KEYWORDS["else"]=10;
  38.     KEYWORDS["do"]=10;
  39.     KEYWORDS["while"]=10;
  40.     KEYWORDS["switch"]=10;
  41.     KEYWORDS["case"]=10;
  42.     KEYWORDS["break"]=10;
  43.     KEYWORDS["continue"]=10;
  44.     KEYWORDS["goto"]=10;
  45.     KEYWORDS["union"]=2;
  46.     KEYWORDS["enum"]=2;
  47.     KEYWORDS["typedef"]=1;
  48.     KEYWORDS["void"]=1;
  49.     KEYWORDS["unsigned"]=3;
  50.     KEYWORDS["signed"]=3;
  51.     KEYWORDS["const"]=3;
  52.     KEYWORDS["long"]=3;
  53.     KEYWORDS["short"]=3;
  54.     KEYWORDS[""]=0;
  55.     KEYWORDS[""]=0;
  56.  
  57.     SpecialStructs["exec"]="ExecBase";
  58.     SpecialStructs["graphics"]="GfxBase";
  59.     SpecialStructs["dos"]="DosLibrary";
  60.     SpecialStructs["intuition"]="IntuitionBase";
  61.  
  62.     spaces=" ";
  63.     for (t=0; t<10; t++)
  64.     spaces=spaces spaces;
  65.  
  66.     for (arg=1; arg<ARGC; arg++)
  67.     {
  68.     part_name=ARGV[arg];
  69.     Part_name=toupper(substr(part_name,1,1)) substr(part_name,2);
  70.  
  71.     if (part_name in SpecialStructs)
  72.         struct_name=SpecialStructs[part_name];
  73.     else
  74.         struct_name="Library";
  75.  
  76. print "Working on " part_name "..."
  77.  
  78.     dir="amiga/" part_name;
  79.     system("mkdir " dir);
  80.     print dir;
  81.     dir=dir"/";
  82.     INPUT="amiga/include/fd/" part_name "_lib.fd"
  83.     print INPUT
  84.  
  85.     # Read LVO
  86.     delete LVO
  87.     while ((getline line < INPUT) > 0)
  88.     {
  89.         if (substr(line,1,6) == "##bias")
  90.         offset = int(substr(line,7))/6;
  91.         else if (substr(line,1,6) == "##base")
  92.         {
  93.         match(line,"[A-Za-z_][A-Za-z0-9_]*$");
  94.         Base = substr(line,RSTART+1,RLENGTH-1);
  95.         }
  96.         else if (!match (line,/[*#]/))
  97.         {
  98.         match(line,"[A-Za-z_][A-Za-z0-9_]*");
  99.         fname=substr(line,RSTART,RLENGTH);
  100.         line=substr(line,RSTART+RLENGTH);
  101.         if (match(line,"[(][^)]*[)]"))
  102.         {
  103.             if (RLENGTH!=2)
  104.             fargs=substr(line,RSTART+1,RLENGTH-2);
  105.             else
  106.             fargs="";
  107.         }
  108.         else
  109.             fargs="";
  110.         line=substr(line,RSTART+RLENGTH);
  111.         if (match(line,"[(][^)]*[)]"))
  112.         {
  113.             if (RLENGTH!=2)
  114.             fregs=substr(line,RSTART+1,RLENGTH-2);
  115.             else
  116.             fregs="";
  117.         }
  118.         else
  119.             fregs="";
  120.         #print fname " (" fargs ") (" fregs ") " offset
  121.         LVO[fname] = offset;
  122.         offset ++;
  123.         LVO_regs[fname] = toupper(fregs);
  124.         }
  125.     }
  126.  
  127.     INPUT="amiga/include/clib/" part_name "_protos.h"
  128.     #print INPUT
  129.     getline line < INPUT
  130.     yyinit(line);
  131.     rt_type="";
  132.  
  133.     #if (!match(FILENAME,"\/.*_"))
  134.     #{
  135.     #    print "Can't find libname"
  136.     #    exit (10);
  137.     #}
  138.     #dir=substr(FILENAME,RSTART+1,RLENGTH-2);
  139.     #
  140.     #if (dir!="")
  141.     #{
  142.     #    system("mkdir " dir);
  143.     #    part_name=dir;
  144.     #    dir=dir "/";
  145.     #}
  146.  
  147.     while ((token=yylex()) != "EOF")
  148.     {
  149.     #print "0 -" token "-" yyval "-"
  150.         if ((token=="keyword" && KEYWORDS[yyval]<10) || token=="typedef")
  151.         {
  152.         plevel=0;
  153.         token=read_type(token);
  154.         fname = yyval;
  155.         token=yylex();
  156.  
  157.         if (token=="(")
  158.         {
  159.             plevel ++;
  160.             token=yylex();
  161.  
  162.             if (rt_ptr!="")
  163.             ret=rt_type " " rt_ptr;
  164.             else
  165.             ret=rt_type;
  166.  
  167.             if (token==")")
  168.             {
  169.             npar=1;
  170.             par_type[1]="void";
  171.             par_ptr[1]="";
  172.             par_name[1]="";
  173.             }
  174.             else
  175.             {
  176.             npar=0;
  177.             while (token!=")")
  178.             {
  179.     #print 1
  180.                 if (token==",")
  181.                 token=yylex();
  182.                 token=read_type(token);
  183.                 if (token=="ident")
  184.                 {
  185.                 name=yyval;
  186.                 token=yylex();
  187.                 }
  188.                 else
  189.                 name="";
  190.  
  191.     #                 if (plevel != 1)
  192.     #                 {
  193.     #                 plevel --;
  194.     #                 name=name ") "
  195.     #                 while((token==yylex())!=")" || plevel!=1)
  196.     #                 {
  197.     #print 2
  198.     #                     if (token=="(")
  199.     #                     plevel ++;
  200.     #                     else if (token==")")
  201.     #                     plevel --;
  202.     #                     name=name " " yyval;
  203.     #                 }
  204.     #                 }
  205.  
  206.                 npar++;
  207.                 par_type[npar]=rt_type;
  208.                 par_ptr[npar]=rt_ptr;
  209.                 par_name[npar]=name;
  210.     #print "npar " npar "-" rt_type "-" rt_ptr "-" name
  211.             }
  212.             }
  213.  
  214.             print "Processing "fname"..."
  215.             #file="/dev/stdout"
  216.             file=dir tolower(fname) ".c"
  217.  
  218.             if (fname in LVO)
  219.             {
  220.             offset=LVO[fname];
  221.             regs=LVO_regs[fname];
  222.             }
  223.             else
  224.             {
  225.             offset=-1;
  226.             regs="";
  227.             }
  228.  
  229.             printf ("/*\n") > file;
  230.             print "    (C) 1995-96 AROS - The Amiga Replacement OS" >> file
  231.             printf ("    %sId$\n", "$") >> file;
  232.             printf ("\n") >> file;
  233.             printf ("    Desc:\n") >> file;
  234.             printf ("    Lang: english\n") >> file;
  235.             printf ("*/\n") >> file;
  236.             printf ("#include \"%s_intern.h\"\n\n", part_name) >> file;
  237.             print "/*****************************************************************************\n" >> file
  238.             print "    NAME */" >>file
  239.             print "#include <clib/" part_name "_protos.h>\n">>file
  240.  
  241.             if (offset!=-1)
  242.             {
  243.             if (npar==1 && par_type[1]=="void" && par_ptr[1] == "" &&
  244.                 par_name[1]=="")
  245.                 print "\tAROS_LH0("ret", "fname",\n" >>file
  246.             else
  247.                 print "\tAROS_LH"npar"("ret", "fname",\n" >>file
  248.             print "/*  SYNOPSIS */" >>file
  249.  
  250.             if (npar==1 && par_type[1]=="void" && par_ptr[1] == "" &&
  251.                 par_name[1]=="")
  252.             {
  253.                 print "\t/* void */" >>file
  254.             }
  255.             else
  256.             {
  257.                 maxlen=0;
  258.                 for (t=1; t<=npar; t++)
  259.                 {
  260.     #print 3
  261.                 len=length(par_type[t]);
  262.                 len2=length(par_ptr[t]);
  263.                 len+=len2 ? len2+1 : 0;
  264.                 if (len > maxlen)
  265.                     maxlen = len;
  266.                 }
  267.  
  268.                 for (t=1; t<=npar; t++)
  269.                 {
  270.     #print 4
  271.                 len=length(par_type[t]);
  272.                 len2=length(par_ptr[t]);
  273.  
  274.                 printf("\tAROS_LHA(%s", par_type[t])>>file;
  275.                 printf("%s", substr(spaces,1,maxlen-len-len2))>>file;
  276.                 printf("%s, %s, %s),\n",par_ptr[t],par_name[t],
  277.                     substr(regs,1,2))>>file;
  278.                 if (regs!="")
  279.                 {
  280.                     regs=substr(regs,4);
  281.                 }
  282.                 }
  283.             }
  284.             print "\n/*  LOCATION */\n\tstruct "struct_name" *, "Base", "offset", "Part_name")">>file
  285.             }
  286.             else
  287.             {
  288.             print "\t"ret" "fname" (\n" >>file
  289.             print "/*  SYNOPSIS */" >>file
  290.  
  291.             if (npar==1 && par_type[1]=="void" && par_ptr[1] == "" &&
  292.                 par_name[1]=="")
  293.             {
  294.                 print "\tvoid)" >>file
  295.             }
  296.             else
  297.             {
  298.                 maxlen=0;
  299.                 for (t=1; t<=npar; t++)
  300.                 {
  301.     #print 3
  302.                 len=length(par_type[t]);
  303.                 len2=length(par_ptr[t]);
  304.                 len+=len2 ? len2+1 : 0;
  305.                 if (len > maxlen)
  306.                     maxlen = len;
  307.                 }
  308.  
  309.                 for (t=1; t<=npar; t++)
  310.                 {
  311.     #print 4
  312.                 len=length(par_type[t]);
  313.                 len2=length(par_ptr[t]);
  314.  
  315.                 printf("\t%s", par_type[t])>>file;
  316.                 printf("%s", substr(spaces,1,maxlen-len-len2))>>file;
  317.                 printf("%s %s",par_ptr[t],par_name[t])>>file;
  318.                 if (t==npar)
  319.                     printf(")\n")>>file;
  320.                 else
  321.                     printf(",\n")>>file;
  322.                 }
  323.             }
  324.             }
  325.             print "\n/*  FUNCTION\n\n    INPUTS\n\n    RESULT\n\n    NOTES\n">>file
  326.             print "    EXAMPLE\n\n    BUGS\n\n    SEE ALSO\n\n    INTERNALS\n">>file
  327.             print "    HISTORY\n\t" date "    digulla automatically created from">>file
  328.             print "\t\t\t    "part_name"_lib.fd and clib/"part_name"_protos.h\n">>file;
  329.             print "*****************************************************************************/" > file
  330.             print "{">>file;
  331.             print "    AROS_LIBFUNC_INIT">>file;
  332.             if (Base!="")
  333.             print "    AROS_LIBBASE_EXT_DECL(struct "struct_name" *,"Base")">>file;
  334.             print "    extern void aros_print_not_implemented (char *);\n">>file;
  335.             print "    aros_print_not_implemented (\"" fname "\");\n">>file;
  336.             print "    AROS_LIBFUNC_EXIT">>file;
  337.             print "} /* " fname " */">>file;
  338.             fclose (file);
  339.         } # found "("
  340.         } # found keyword
  341.     } # while token != EOF
  342.     } # for all args
  343. } # BEGIN
  344.  
  345. function read_type(pretoken     ,token) {
  346.     token=pretoken;
  347. #print "token3 " token "-" yyval
  348.  
  349.     rt_type="";
  350.     while ((token=="keyword" && KEYWORDS[yyval]<10) || token=="typedef" ||
  351.     token=="...")
  352.     {
  353. #print 5
  354.     rt_type=rt_type " " yyval;
  355.     if (KEYWORDS[yyval]==2)
  356.     {
  357.         token=yylex();
  358.         rt_type=rt_type " " yyval;
  359.     }
  360.     token=yylex();
  361. #print "token2 " token
  362.     }
  363.     rt_type=substr(rt_type,2);
  364. #print "type " rt_type
  365.     if (rt_type in RTYPES)
  366.     rt_type = RTYPES[rt_type];
  367.  
  368.     rt_ptr="";
  369.     while (token=="*" || token=="(")
  370.     {
  371. #print 6
  372.     rt_ptr=rt_ptr yyval;
  373.     if (token=="(")
  374.         plevel++;
  375.     token=yylex();
  376. #print "token1 " token
  377.     }
  378. #print "ptr " rt_ptr
  379.  
  380.     return token;
  381. }
  382.  
  383. function yyinit(str) {
  384.     yyrest=str;
  385. }
  386.  
  387. function yylex() {
  388. #print yylex
  389.     for (yyagain=1; yyagain; )
  390.     {
  391.     yyagain=0;
  392.     if (yyrest=="" || match(yyrest,/^[ \t\014\r]+/))
  393.     {
  394.         while (1)
  395.         {
  396.         while (yyrest=="")
  397.         {
  398.             if ((getline yyrest < INPUT) != 1)
  399.             return "EOF";
  400. #print "1 -" yyrest "-"
  401.             if (substr(yyrest,1,1) == "#")
  402.             yyrest="";
  403.         }
  404.         if (!match(yyrest,"^[ \t\014\r]+"))
  405.             break;
  406.         yyrest=substr(yyrest,RSTART+RLENGTH);
  407.         }
  408.     }
  409.     if (match(yyrest,/^\/\*/))
  410.     {
  411.         yyrest=substr(yyrest,3);
  412.         while (!match(yyrest,"\*\/"))
  413.         {
  414.         if ((getline yyrest < INPUT) != 1)
  415.             return "EOF";
  416. #print "2 -" yyrest "-"
  417.         }
  418.         yyrest=substr(yyrest,RSTART+RLENGTH);
  419.         yyagain=1;
  420.     }
  421.     }
  422.     if (match(yyrest,"^[a-zA-Z_][a-zA-Z0-9_]*"))
  423.     {
  424.     yyval=substr(yyrest,RSTART,RLENGTH);
  425.     yyrest=substr(yyrest,RSTART+RLENGTH);
  426.  
  427.     if (yyval in TYPES)
  428.         return "typedef";
  429.     else if (yyval in KEYWORDS)
  430.         return "keyword";
  431.     else
  432.         return "ident";
  433.     }
  434.     if (match(yyrest,"^0[xX][0-9a-f]+[lL]?"))
  435.     {
  436.     yyval=substr(yyrest,RSTART,RLENGTH);
  437.     yyrest=substr(yyrest,RSTART+RLENGTH);
  438.     return "int_const";
  439.     }
  440.     if (match(yyrest,/^([0-9]*\.[0-9]+|[0-9]+\.[0-9]*)([eE][0-9]+)?[fF]?/))
  441.     {
  442.     yyval=substr(yyrest,RSTART,RLENGTH);
  443.     yyrest=substr(yyrest,RSTART+RLENGTH);
  444.     return "float_const";
  445.     }
  446.     if (match(yyrest,"^0[0-7]+[lL]?"))
  447.     {
  448.     yyval=substr(yyrest,RSTART,RLENGTH);
  449.     yyrest=substr(yyrest,RSTART+RLENGTH);
  450.     return "int_const";
  451.     }
  452.     if (match(yyrest,"^[1-9][0-9]*[lL]?"))
  453.     {
  454.     yyval=substr(yyrest,RSTART,RLENGTH);
  455.     yyrest=substr(yyrest,RSTART+RLENGTH);
  456.     return "int_const";
  457.     }
  458.     if (match(yyrest,"^\""))
  459.     {
  460.     if (match(yyrest,"^\"(\\\"|[^\"])*\""))
  461.     {
  462.         yyval=substr(yyrest,RSTART,RLENGTH);
  463.         yyrest=substr(yyrest,RSTART+RLENGTH);
  464.         return "str_const";
  465.     }
  466.     else
  467.     {
  468.         yyval=substr(yyrest,1,length(yyrest)-1);
  469.         while (1)
  470.         {
  471.         if ((getline yyrest < INPUT) != 1)
  472.             return "EOF";
  473.         if (match(yyrest,"^(\\\"|[^\"])*\""))
  474.             break;
  475.         yyval=yyval substr(yyrest,1,length(yyrest)-1);
  476.         }
  477.         yyval=yyval substr(yyrest,RSTART,RLENGTH);
  478.         yyrest=substr(yyrest,RSTART+RLENGTH);
  479.         return "str_const";
  480.     }
  481.     }
  482.     if (substr(yyrest,1,3)=="...")
  483.     {
  484.     yyval="...";
  485.     yyrest=substr(yyrest,4);
  486.     return yyval;
  487.     }
  488.     yyval=substr(yyrest,1,1);
  489.     yyrest=substr(yyrest,2);
  490.     return yyval;
  491. }
  492.